package com.nuaa.yygh.hosp.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nuaa.model.hosp.HospitalSet;
import com.nuaa.vo.hosp.HospitalSetQueryVo;
import com.nuaa.yygh.common.result.Result;
import com.nuaa.yygh.common.util.MD5;
import com.nuaa.yygh.hosp.service.HospitalSetService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Random;

@Api(tags = "医院设置管理")
@RestController
//指定控制器可以处理哪些url请求

@RequestMapping("/admin/hosp/hospitalSet")
public class HospitalSetController {

    //注入srvice 调用这个service里面的额crud方法
    @Autowired
    private HospitalSetService hospitalSetService;


    // http://localhost:8201/admin/hosp/hospitalSet/findALL

    //1.调用service中查询方法获取医院设置表的所有信息
    @ApiOperation(value = "1.获取所有医院设置")
    @GetMapping("findALL")
    public Result findAllHospitalSet(){
        //要得到的是Result类型的结果，用一个list来接收
        //这个list（）方法就是Iservice中写过的基础方法
        //引入Result是为了返回的结果统一，会将list这个data build到Result里再返回
        List<HospitalSet> list = hospitalSetService.list();
        return Result.ok(list);
    }

    //2.删除医院设置
    //传入要删除的医院id
    @ApiOperation(value = "2.逻辑删除医院设置")
    @DeleteMapping("{id}")
    public Result removeHospSet(@PathVariable Long id){
        boolean flag = hospitalSetService.removeById(id);
        if(flag) return Result.ok();
        else return Result.fail();
    }



    //3.条件查询带分页
    @ApiOperation(value = "3.条件查询带分页")
    @PostMapping("findPageHospSet/{current}/{limit}")
    public Result findPageHospSet(@PathVariable long current,
                                  @PathVariable long limit,
                                  //该vo对象包括医院编号和名称   使用RequestBody 接受前端传递给后端的josn数据 就是请求体中的数据传参
                                  //(required = false）表示后面的值可以为空,并且要将提交方式改成post，先将josn数据传上去
                                  @RequestBody(required = false)HospitalSetQueryVo hospitalSetQueryVo){
        //创建page对象来传递当前页和每页记录数
        //根据查询条件将所需要的全部数据查到，封装到Page对象，传到前端
        Page<HospitalSet> page = new Page<>(current,limit);
        //构建条件
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        String hosname = hospitalSetQueryVo.getHosname();
        String hoscode = hospitalSetQueryVo.getHoscode();
        //eq 等于  即hoscode = hospitalSetQueryVo.getHoscode() like ‘%值’(就是包含)  hosname like hospitalSetQueryVo.getHosname()
        if (!StringUtils.isEmpty(hosname)){
            wrapper.like("hosname",hosname);
        }
        if (!StringUtils.isEmpty(hoscode)){
            wrapper.eq("hoscode",hoscode);
        }
        Page<HospitalSet> pageHospitalSet = hospitalSetService.page(page,wrapper);

        return Result.ok(pageHospitalSet);
    }

    @ApiOperation(value = "4.添加医院设置")
    //要添加数据因此使用post
    @PostMapping("saveHospitalSet")
    //前端传入的当然是hospitalSet的数据
    public Result saveHospitalSet(@RequestBody HospitalSet hospitalSet){
        //状态和密钥需要单独设置
        //设置这个状态 1可用 0不可用
        hospitalSet.setStatus(1);
        //产生签名密钥
        Random random = new Random();
        //MD5有一个加密方法，利用创建的时间和随机产生的数进行加密
        hospitalSet.setSignKey(MD5.encrypt(System.currentTimeMillis()+""+random.nextInt(1000)));

        //调用service
        boolean save = hospitalSetService.save(hospitalSet);
        if (save) return Result.ok();
        else return  Result.fail();
    }

    //5 根据id获取医院设置
    @ApiOperation(value = "5.获取所有医院设置")
    @GetMapping("findHospSet/{id}")
    public Result findHospSet(@PathVariable long id){
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        //好像可以不用查id是否为空，因为这个参数是要输进去的
        //试一下错误的情况
        //但是可以判断hospitalSet是否为空，如果不判断，查没有的id虽然查不到，但是会传200的code
        if (!StringUtils.isEmpty(hospitalSet)) return Result.ok(hospitalSet);
        else return Result.fail();
    }
    //6 修改医院设置
    @ApiOperation(value = "6.修改医院设置")
    @PostMapping("updateHospitalSet")
    public Result updateHospitalSet(@RequestBody HospitalSet hospitalSet){
        //直接调用service中的方法就可以了
        //id是一定要输的，改这个id的设置，然后改你想改的就可以了
        boolean flag = hospitalSetService.updateById(hospitalSet);
        if(flag) return Result.ok();
        else  return Result.fail();

    }
    //7 批量删除医院设置
    @ApiOperation(value = "7 批量删除医院设置")
    @DeleteMapping("batchRemove")
    public Result batchRemoveHospitalSet(@RequestBody List<Long> idList) {
        hospitalSetService.removeByIds(idList);
        return Result.ok();
    }

    //8.上锁医院设置，将医院设置锁之后就不能操作医院。防止误操作
    @ApiOperation(value = "8.锁定解锁医院设置")
    @PutMapping("lockHospitalSet/{id}/{status}")
    public Result lockHospitalSet(@PathVariable Long id,
                                  @PathVariable Integer status){
        //通过id获取医院设置
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        //调用医院设置的方法
        hospitalSet.setStatus(status);
        //再更新这个医院设置
        hospitalSetService.updateById(hospitalSet);
        return Result.ok();
    }

    //9.发送签名密钥
    @ApiOperation(value = "9.发送签名密钥")
    @PutMapping("sendKey/{id}")
    public Result lockHospitalSet(@PathVariable Long id){
        //通过id获取医院设置
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        String signKey = hospitalSet.getSignKey();
        String hoscode = hospitalSet.getHoscode();
        //TODO 发送短信
        return Result.ok();

    }



}
